﻿using System;
using System.Collections.Generic;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WLMCoreLibrary;
using SAW_Core;
using System.Data;
using System.Data.Odbc;
using System.Text;
using System.Configuration;
using System.Xml;

namespace SAW
{
    public partial class ModuloClientes : System.Web.UI.Page
    {
        dbConnector ConexionDB;
        protected override void OnUnload(EventArgs e)
        {
            //ConexionDB.CloseConnection();
            base.OnUnload(e);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            ConexionDB = new dbConnector();
            ConexionDB.AutoCommit = false;
            FuncionesLocales.CheckPagePermision(ref ConexionDB);
            if (Request.QueryString["listado"] == "true")
            {
                if (Request.QueryString["idCliente"] != null)
                {
                    if (Request.QueryString["xmlpagos"] != null)
                        ListadoPagosClienteXML(Convert.ToInt32(WLMFunctions.CleanQuery(Request.QueryString["idCliente"])));
                }
                else
                    ListadoClientesXML();
            }


            FuncionesLocales.ManejarMensaje();

            if (Request.QueryString["reporteCxC"] != null)
            {
                PanelGridCxC.Visible = true;
                PanelGridClientes.Visible = false;
            }

            if (Request.QueryString["imprimirCliente"] != null)
            {
                imprimirDetalleCliente(Convert.ToInt32(Request.QueryString["idCliente"]));
            }

            if (Request.QueryString["Add"] == "true")
            {
                PanelGridClientes.Visible = false;
                PanelDatosClientes.Visible = true;
                PreloadInfo();
                botonGuardarCliente.Enabled = true;
                if (idRegistroCliente.Text == "0")
                    PanelClienteSaldoInicial.Visible = true;
            }
            else
                if (Request.QueryString["idCliente"] != null && !IsPostBack)
                    if (Request.QueryString["editar"] != null)
                    {
                        if (Request.QueryString["json"] == null)
                            CargarRegistro(Convert.ToInt32(Request.QueryString["idCliente"]));
                        else
                        {
                            Cliente cliente = new Cliente(Convert.ToInt32(Request.QueryString["idCliente"]), ref ConexionDB);
                            Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(cliente));
                            ConexionDB.CloseConnection();
                            Response.End();
                        }
                    }
                    else
                    {
                        if (Request.QueryString["eliminar"] != null)
                            EliminarCliente(Convert.ToInt32(Request.QueryString["idCliente"]));
                        if (Request.QueryString["detalle"] != null)
                        {

                            DetalleCliente(Convert.ToInt32(Request.QueryString["idCliente"]));
                        }
                    }




        }

        protected void DetalleCliente(int idCliente)
        {
            PanelGridClientes.Visible = false;
            PanelDetalleCliente.Visible = true;

            Cliente cliente = new Cliente(idCliente, ref ConexionDB);
            cliente.NombreCategoria = new ClienteCategoria(cliente.idCategoria, ref ConexionDB).NombreCategoria;
            cliente.NombreVendedor = new Vendedor(cliente.idVendedor, ref ConexionDB).NombreCompleto;
            cliente.NombreCondicionesPago = new Condicionespago(cliente.idCondicionesPago, ref ConexionDB).NombreCondicion;
            VentaCollection cotizaciones = new VentaCollection(cliente, ref ConexionDB);
            idRegistroCliente.Text = cliente.id.ToString();
            if (cotizaciones.UltimaCotizacion() != null)
            {
                cliente.UltimaCotizacion = cotizaciones.UltimaCotizacion().Total;
                cliente.FechaUltimaCotizacion = cotizaciones.UltimaCotizacion().fechaCreacion;
            }
            if (cotizaciones.UltimoPedido() != null)
            {
                cliente.UltimaCompra = cotizaciones.UltimoPedido().Total;
                cliente.FechaUltimaCompra = cotizaciones.UltimoPedido().fechaCreacion;
            }


            cliente.GenerarArchivoXML();

            string rutaArchivos = ConfigurationManager.AppSettings["XMLClientesFolder"] + idCliente.ToString("00000") + "/";
            LabelDetalleCliente.Text = WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + idCliente.ToString("00000") + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + "clientePantalla.xsl");
            Response.Write("<script>" +
                "var idClienteDetalle=" + idCliente + ";" +
                "$('#botonEditarCliente').attr('disabled',false);" +
                "$('#botonEliminarCliente').attr('disabled',false);" +
                "$('#botonImprimirCliente').attr('disabled',false);" +
                "$('#botonConfirmarPagoClienteCxC').attr('disabled',false);" +
                "</script>");



        }

        protected void botonGuardarCliente_Click(object sender, EventArgs e)
        {
            GuardarCliente();
        }

        protected void GuardarCliente()
        {
            Cliente cliente;
            if (idRegistroCliente.Text == "0")
            {
                cliente = new Cliente(ref ConexionDB);
                //
            }
            else
                cliente = new Cliente(Convert.ToInt32(idRegistroCliente.Text), ref ConexionDB);
            //Temporalmente el saldo actual del cliente se podra editar
            cliente.SaldoActual = WLMFunctions.MonedaADecimal(SaldoInicial.Text);
            cliente.RazonSocial = RazonSocial.Text;
            cliente.NombreComercial = NombreComercial.Text;
            cliente.RepresentanteLegal = RepresentanteLegal.Text;
            cliente.RFC = RFC.Text.ToUpper();
            cliente.Email = EmailCliente.Text;
            cliente.DireccionFacturacion.Calle = F_Calle.Text;
            cliente.DireccionFacturacion.NumeroExterior = F_NumeroExterior.Text;
            cliente.DireccionFacturacion.NumeroInterior = F_NumeroInterior.Text;
            cliente.DireccionFacturacion.Colonia = F_Colonia.Text;
            cliente.DireccionFacturacion.Municipio = F_Municipio.Text;
            cliente.DireccionFacturacion.Ciudad = F_Ciudad.Text;
            cliente.DireccionFacturacion.Estado = F_Estado.Text;
            cliente.DireccionFacturacion.CP = F_CP.Text;
            cliente.DireccionEnvio.Calle = Calle.Text;
            cliente.DireccionEnvio.NumeroExterior = NumeroExterior.Text;
            cliente.DireccionEnvio.NumeroInterior = NumeroInterior.Text;
            cliente.DireccionEnvio.Colonia = Colonia.Text;
            cliente.DireccionEnvio.Ciudad = Ciudad.Text;
            cliente.DireccionEnvio.Municipio = Municipio.Text;
            cliente.DireccionEnvio.Estado = Estado.Text;
            cliente.DireccionEnvio.CP = CP.Text;
            cliente.Telefono = Telefono.Text;
            cliente.Telefono2 = Telefono2.Text;
            cliente.Telefono3 = Telefono3.Text;
            cliente.FAX = FAX.Text;
            cliente.LineaTransporte = LineaTransporte.Text;
            cliente.LimiteCredito = WLMFunctions.MonedaADecimal(LimiteCredito.Text);
            cliente.idCondicionesPago = Convert.ToInt32(idCondicionesPago.SelectedValue);
            cliente.WebSite = WebSite.Text;
            cliente.Observaciones = Observaciones.Text;
            cliente.idListaPrecios = Convert.ToInt32(idListaPrecios.SelectedValue);
            cliente.idVendedor = Convert.ToInt32(idVendedor.SelectedValue);
            ClienteCategoria categoria = new ClienteCategoria(Convert.ToInt32(idCategoriaCliente.Text), ref ConexionDB);
            //if ( categoria.id == 0)
            //{//categoria.NombreCategoria.ToLower() != CategoriaCliente.Text.ToLower() ||
            //    categoria = new ClienteCategoria(ref ConexionDB);
            //    categoria.NombreCategoria = CategoriaCliente.Text.ToLower();
            //    categoria.Save();
            //    cliente.idCategoria = categoria.id;
            //}
            //else
            //    cliente.idCategoria = categoria.id;
            cliente.idCategoria = GuardarCategoria(CategoriaCliente.Text);
            cliente.Save();
            for (int x = 1; x <= Convert.ToInt32(Request.Form["cantidadContactosCliente"]); x++)
            {
                GuardarContactoCliente(cliente, x);
            }
            //Response.Write("El cliente ha sido guardado Correctamente");
            //Response.End();
            ConexionDB.CloseConnection();
            Response.Redirect("/ModuloClientes.aspx");

        }

        protected int GuardarCategoria(string nombreCategoria)
        {
            ClienteCategoria categoria = new ClienteCategoria(nombreCategoria.ToLower(), ref ConexionDB);
            //if (linea.NombreLinea.ToLower() != NombreLinea.ToLower()|| 
            if (categoria.id == 0)
            {
                categoria = new ClienteCategoria(ref ConexionDB);
                categoria.NombreCategoria = nombreCategoria.ToLower();
                categoria.Save();
            }
            return categoria.id;
        }

        protected void GuardarDominio(string NombreDominio)
        {
            DominioEmail dominio = new DominioEmail(NombreDominio, ref ConexionDB);
            if (dominio.id == 0)
            {
                dominio = new DominioEmail(ref ConexionDB);
                dominio.Dominio = NombreDominio;
                dominio.Save();
            }
        }

        protected void GuardarContactoCliente(Cliente cliente, int idRequest)
        {
            if (Request["nombreContactoCliente" + idRequest] != "" && Request["nombreContactoCliente" + idRequest] != null)
            {
                Contacto contacto;
                if (Request["ConctactoId" + idRequest] == "0")
                    contacto = new Contacto(ref ConexionDB);
                else
                    contacto = new Contacto(Convert.ToInt32(Request["ConctactoId" + idRequest]), ref ConexionDB);

                contacto.idCliente = cliente.id;
                if (Request["ConctactoEliminado" + idRequest] == "true")
                    contacto.idCliente = 0;
                contacto.Nombre = Request["nombreContactoCliente" + idRequest];
                contacto.Apellidos = Request["apellidosContactoCliente" + idRequest];
                contacto.Puesto = Request["puestoContactoCliente" + idRequest];
                contacto.Telefono = Request["telefonoContactoCliente" + idRequest];
                contacto.Celular = Request["celularContactoCliente" + idRequest];
                contacto.Email = Request["emailUsuarioContactoCliente" + idRequest] + "@" + Request["emailDominioContactoCliente" + idRequest];
                GuardarDominio(Request["emailDominioContactoCliente" + idRequest].ToString());
                contacto.Calle = cliente.DireccionEnvio.Calle;
                contacto.NumeroExterior = cliente.DireccionEnvio.NumeroExterior;
                contacto.NumeroInterior = cliente.DireccionEnvio.NumeroInterior;
                contacto.Colonia = cliente.DireccionEnvio.Colonia;
                contacto.Ciudad = cliente.DireccionEnvio.Ciudad;
                contacto.Municipio = cliente.DireccionEnvio.Municipio;
                contacto.Estado = cliente.DireccionEnvio.Estado;
                contacto.Save();

            }
        }

        protected void CargarRegistro(int idRegistro)
        {
            PreloadInfo();
            botonGuardarCliente.Enabled = true;
            PanelGridClientes.Visible = false;
            PanelDatosClientes.Visible = true;
            Cliente cliente = new Cliente(idRegistro, ref ConexionDB);


            //Saldo Actual temporalmente se podra editar
            SaldoInicial.Text = cliente.SaldoActual.ToString("C");

            idRegistroCliente.Text = cliente.id.ToString();
            RazonSocial.Text = cliente.RazonSocial;
            NombreComercial.Text = cliente.NombreComercial;
            RepresentanteLegal.Text = cliente.RepresentanteLegal;
            RFC.Text = cliente.RFC;
            EmailCliente.Text = cliente.Email;
            F_Calle.Text = cliente.DireccionFacturacion.Calle;
            F_NumeroExterior.Text = cliente.DireccionFacturacion.NumeroExterior;
            F_NumeroInterior.Text = cliente.DireccionFacturacion.NumeroInterior;
            F_Colonia.Text = cliente.DireccionFacturacion.Colonia;
            F_Municipio.Text = cliente.DireccionFacturacion.Municipio;
            F_Ciudad.Text = cliente.DireccionFacturacion.Ciudad;
            F_Estado.Text = cliente.DireccionFacturacion.Estado;
            F_CP.Text = cliente.DireccionFacturacion.CP;
            Calle.Text = cliente.DireccionEnvio.Calle;
            NumeroExterior.Text = cliente.DireccionEnvio.NumeroExterior;
            NumeroInterior.Text = cliente.DireccionEnvio.NumeroInterior;
            Colonia.Text = cliente.DireccionEnvio.Colonia;
            Ciudad.Text = cliente.DireccionEnvio.Ciudad;
            Municipio.Text = cliente.DireccionEnvio.Municipio;
            Estado.Text = cliente.DireccionEnvio.Estado;
            CP.Text = cliente.DireccionEnvio.CP;
            Telefono.Text = cliente.Telefono;
            Telefono2.Text = cliente.Telefono2;
            Telefono3.Text = cliente.Telefono3;
            FAX.Text = cliente.FAX;
            LineaTransporte.Text = cliente.LineaTransporte;
            LimiteCredito.Text = cliente.LimiteCredito.ToString("C");
            WebSite.Text = cliente.WebSite;
            Observaciones.Text = cliente.Observaciones;

            idCategoriaCliente.Text = cliente.idCategoria.ToString();
            CategoriaCliente.Text = new ClienteCategoria(cliente.idCategoria, ref ConexionDB).NombreCategoria;
            if (idVendedor.Items.FindByValue(cliente.idVendedor.ToString()) != null)
                idVendedor.SelectedValue = cliente.idVendedor.ToString();
            if (idCondicionesPago.Items.FindByValue(cliente.idCondicionesPago.ToString()) != null)
                idCondicionesPago.SelectedValue = cliente.idCondicionesPago.ToString();
            idListaPrecios.SelectedValue = cliente.idListaPrecios.ToString();
            botonGuardarCliente.Text = "Editar Cliente";

            ContactoCollection constactos = new ContactoCollection(cliente, ref ConexionDB);
            StringBuilder cadenaContactos = new StringBuilder();
            cadenaContactos.Append("<script>$(document).ready(function () {");
            foreach (Contacto cont in constactos.Elementos)
            {

                cadenaContactos.Append("cargarContactoCliente('" + cont.id + "', '" + cont.Nombre + "', '" + cont.Apellidos + "', '" + cont.Puesto + "', '" + cont.Telefono + "', '" + cont.Celular + "','" + cont.Email + "');");
            }

            cadenaContactos.Append("});");

            cadenaContactos.Append("</script>");
            contactosActuales.Text = cadenaContactos.ToString();
        }

        protected void ListadoClientesXML()
        {
            string FieldList = "SELECT C.id,RazonSocial," +
                "NombreComercial,Cat.nombreCategoria," +
                "CONCAT(V.Nombre,' ',V.Apellidos) as vendedorAsignado," +
                "SaldoActual,LimiteCredito  " +
                "FROM CLIENTES C " +
                "LEFT JOIN USUARIOS V ON V.id=C.idVendedor " +
                "LEFT JOIN CLIENTESCATEGORIAS Cat ON Cat.id=C.idCategoria";
    
            string where = "";
            if (Request["_search"] != null)
            {
                if (Request["_search"] == "true")
                {
                    XmlDocument filtrosBusqueda = Newtonsoft.Json.JsonConvert.DeserializeXmlNode("{'var':" + Request.QueryString["filters"] + "}");
                    where = " WHERE C.activo=1 ";
                    foreach (XmlNode filtro in filtrosBusqueda.GetElementsByTagName("rules"))
                    {
                        string searchField = filtro.FirstChild.InnerText;
                        string searchToken=filtro.LastChild.InnerText;
                        switch (searchField)
                        {
                            case "id":
                                where += " AND C.id =" + searchToken+ " ";
                                break;
                            case "vendedorasignado":
                                where += " AND (V.Nombre LIKE '%" + searchToken + "%' OR V.Apellidos LIKE '%" + searchToken + "%') ";
                                break;
                                //Buscando en Moneda y numeros
                            case "SaldoActual":
                            case "LimiteCredito":
                                where += " AND " + searchField+ "=" +Convert.ToDecimal(searchToken.Replace("$","").Replace(",","")) + " ";
                                break;
                            //Busqueda por cadena normal
                            default:
                                where += " AND " + searchField+ " LIKE '%" + searchToken + "%'";
                                break;
                        }
                    }
                }
                else where = " WHERE C.activo=1 ";
            }

            PaginacionXML paginacion = WLMFunctions.GetPaginacionXML();
            WLMFunctions.XMLGrid(FieldList,
                where,
                paginacion.SortOrder,
                paginacion.Limit,
                paginacion.DataPage,
                paginacion.RowsPerPage,
                true, true);

        }

        protected void ListadoPagosClienteXML(int idCliente)
        {
            string FieldList = "SELECT P.id,C.id,CONCAT(F.serie,CAST(F.noFolio AS CHAR)) as folioFactura,"+
                "DATE_FORMAT(P.FEchaRealizacion,'%d-%m-%Y'),"+
                " CASE tipoMovimiento WHEN 1 THEN 'Cheque' WHEN 2 THEN 'Transferencia' WHEN 3 THEN 'Efectivo' END as tipoMov,"+
                " B.Alias, TotalPago " +
                "FROM cotizacionesPagos P "+
                "LEFT JOIN COTIZACIONES C ON C.id=P.IdCotizacion "+
                "LEFT JOIN Facturas F ON F.id=P.idFactura "+
                "LEFT JOIN BANCOSMOVIMIENTOS M ON M.id=P.idMovimientoBancario "+
                "LEFT JOIN BANCOS B ON B.id=M.idCuentaBancaria ";
            PaginacionXML paginacion = WLMFunctions.GetPaginacionXML();
            String where = " WHERE C.idCliente='" + idCliente + "' AND P.activo=1 ";
            WLMFunctions.XMLGrid(FieldList,
                where,
                paginacion.SortOrder,
                paginacion.Limit,
                paginacion.DataPage,
                paginacion.RowsPerPage,
                true,true);
        }

        protected void PreloadInfo()
        {
            CondicionespagoCollection condiciones = new CondicionespagoCollection(ref ConexionDB);
            idCondicionesPago.DataValueField = "id";
            idCondicionesPago.DataTextField = "NombreCondicion";
            idCondicionesPago.DataSource = condiciones.Elementos;
            idCondicionesPago.DataBind();

            VendedorCollection vendedores = new VendedorCollection(ref ConexionDB);
            idVendedor.DataValueField = "id";
            idVendedor.DataTextField = "NombreCompleto";
            idVendedor.DataSource = vendedores.Elementos;
            idVendedor.DataBind();

        }

        protected void EliminarCliente(int idClienteBorrar)
        {
            Cliente cliente = new Cliente(idClienteBorrar, ref ConexionDB);
            cliente.Delete();
            string urlRedireccion = "/moduloClientes.aspx?mensaje=El Cliente " + cliente.RazonSocial + " ha sido eliminado del sistema!!";
            ConexionDB.CloseConnection();
            Response.Redirect(urlRedireccion);
        }

        protected void imprimirDetalleCliente(int idRegistroImprimir)
        {
            Cliente cliente = new Cliente(idRegistroImprimir, ref ConexionDB);
            cliente.NombreCategoria = new ClienteCategoria(cliente.idCategoria, ref ConexionDB).NombreCategoria;
            cliente.NombreVendedor = new Vendedor(cliente.idVendedor, ref ConexionDB).NombreCompleto;
            cliente.NombreCondicionesPago = new Condicionespago(cliente.idCondicionesPago, ref ConexionDB).NombreCondicion;
            VentaCollection cotizaciones = new VentaCollection(cliente, ref ConexionDB);
            idRegistroCliente.Text = cliente.id.ToString();
            if (cotizaciones.UltimaCotizacion() != null)
            {
                cliente.UltimaCotizacion = cotizaciones.UltimaCotizacion().Total;
                cliente.FechaUltimaCotizacion = cotizaciones.UltimaCotizacion().fechaCreacion;
            }
            if (cotizaciones.UltimoPedido() != null)
            {
                cliente.UltimaCompra = cotizaciones.UltimoPedido().Total;
                cliente.FechaUltimaCompra = cotizaciones.UltimoPedido().fechaCreacion;
            }


            cliente.GenerarArchivoXML();

            string rutaArchivos = ConfigurationManager.AppSettings["XMLClientesFolder"] + idRegistroImprimir.ToString("00000") + "/";

            ConexionDB.CloseConnection();

            PDFCreator pdf = new PDFCreator();
            pdf.CrearPDFdeHTML("<html><body>" + WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + idRegistroImprimir.ToString("00000") + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + "clientePantalla.xsl") + "</body></html>", cliente.RazonSocial.Replace(" ", "_"), rutaArchivos, true, true);


            Response.End();
        }
    }
}